package service

import (
	"fmt"
	"gligli/cache"
	"gligli/model"
	"gligli/serializer"
	"strings"
)

// DailyRankService 每日排行的服务
type DailyRankService struct {

}

// Get 获取排行
func (service *DailyRankService) Get() serializer.Response {
	var videos []model.Video

	// 从redis中读取点击前十的视频
	// 核心代码
	// redis中的语法：ZREVRANGE key start stop
	// 成员的位置按照分数从大到小排列，相同分数按照字典序倒序排列
	vids, _ := cache.RedisClient.ZRevRange(cache.DailyRankKey, 0, 9).Result()
	// 视频有点击的时候
	if len(vids) >= 1 {
		// 将上边获取的视频id列表格式化
		order := fmt.Sprintf("FIELD(id, %s)", strings.Join(vids,","))
		// 根据上边redis获取到的视频id来获取mysql数据库中的内容
		// Order的目的：只是用Where的时候不会按照刚刚获取的热榜顺序进行排序，使用Order来按照之前获取的视频热度进行排序
		// 来自GORM库
		err := model.DB.Where("id in (?)", vids).Order(order).Find(&videos).Error
		if err != nil {
			return serializer.Response{
				Status:50000,
				Msg:"数据库连接错误",
				Error:err.Error(),
			}
		}
	}


	return serializer.Response{
		Data:serializer.BuildVideos(videos),
	}
}